/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladoresJpa;

import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import model.DicionarioMER;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Persistence;
import model.AtributoMER;
import model.AtributoMR;
import model.Tabela;
import model.AssociacaoEntidadeAtributo;
import model.AssociacaoRelacionamentoAtributo;

/**
 * Módulo MER
 * Classe de Entidade do Banco de Dados, gerada automaticamente, porém com certas modificações
 * @author Eduardo, Maylon e Kamilla
 */
public class AtributoMERJpaController implements Serializable {

    public AtributoMERJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;
 public AtributoMERJpaController(){
    if(emf==null)
        emf = Persistence.createEntityManagerFactory("unb-gama-threedsPU");
            }
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(AtributoMER atributoMER) throws PreexistingEntityException, Exception {
        if (atributoMER.getDicionarioMERList() == null) {
            atributoMER.setDicionarioMERList(new ArrayList<DicionarioMER>());
        }
        if (atributoMER.getAtributoMERList() == null) {
            atributoMER.setAtributoMERList(new ArrayList<AtributoMER>());
        }
        if (atributoMER.getAtributoMERList1() == null) {
            atributoMER.setAtributoMERList1(new ArrayList<AtributoMER>());
        }
        if (atributoMER.getAtributoMRList() == null) {
            atributoMER.setAtributoMRList(new ArrayList<AtributoMR>());
        }
        if (atributoMER.getTabelaList() == null) {
            atributoMER.setTabelaList(new ArrayList<Tabela>());
        }
        if (atributoMER.getAssociacaoEntidadeAtributoList() == null) {
            atributoMER.setAssociacaoEntidadeAtributoList(new ArrayList<AssociacaoEntidadeAtributo>());
        }
        if (atributoMER.getAssociacaoRelacionamentoAtributoList() == null) {
            atributoMER.setAssociacaoRelacionamentoAtributoList(new ArrayList<AssociacaoRelacionamentoAtributo>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<DicionarioMER> attachedDicionarioMERList = new ArrayList<DicionarioMER>();
            for (DicionarioMER dicionarioMERListDicionarioMERToAttach : atributoMER.getDicionarioMERList()) {
                dicionarioMERListDicionarioMERToAttach = em.getReference(dicionarioMERListDicionarioMERToAttach.getClass(), dicionarioMERListDicionarioMERToAttach.getId());
                attachedDicionarioMERList.add(dicionarioMERListDicionarioMERToAttach);
            }
            atributoMER.setDicionarioMERList(attachedDicionarioMERList);
            List<AtributoMER> attachedAtributoMERList = new ArrayList<AtributoMER>();
            for (AtributoMER atributoMERListAtributoMERToAttach : atributoMER.getAtributoMERList()) {
                atributoMERListAtributoMERToAttach = em.getReference(atributoMERListAtributoMERToAttach.getClass(), atributoMERListAtributoMERToAttach.getNome());
                attachedAtributoMERList.add(atributoMERListAtributoMERToAttach);
            }
            atributoMER.setAtributoMERList(attachedAtributoMERList);
            List<AtributoMER> attachedAtributoMERList1 = new ArrayList<AtributoMER>();
            for (AtributoMER atributoMERList1AtributoMERToAttach : atributoMER.getAtributoMERList1()) {
                atributoMERList1AtributoMERToAttach = em.getReference(atributoMERList1AtributoMERToAttach.getClass(), atributoMERList1AtributoMERToAttach.getNome());
                attachedAtributoMERList1.add(atributoMERList1AtributoMERToAttach);
            }
            atributoMER.setAtributoMERList1(attachedAtributoMERList1);
            List<AtributoMR> attachedAtributoMRList = new ArrayList<AtributoMR>();
            for (AtributoMR atributoMRListAtributoMRToAttach : atributoMER.getAtributoMRList()) {
                atributoMRListAtributoMRToAttach = em.getReference(atributoMRListAtributoMRToAttach.getClass(), atributoMRListAtributoMRToAttach.getNome());
                attachedAtributoMRList.add(atributoMRListAtributoMRToAttach);
            }
            atributoMER.setAtributoMRList(attachedAtributoMRList);
            List<Tabela> attachedTabelaList = new ArrayList<Tabela>();
            for (Tabela tabelaListTabelaToAttach : atributoMER.getTabelaList()) {
                tabelaListTabelaToAttach = em.getReference(tabelaListTabelaToAttach.getClass(), tabelaListTabelaToAttach.getNome());
                attachedTabelaList.add(tabelaListTabelaToAttach);
            }
            atributoMER.setTabelaList(attachedTabelaList);
            List<AssociacaoEntidadeAtributo> attachedAssociacaoEntidadeAtributoList = new ArrayList<AssociacaoEntidadeAtributo>();
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach : atributoMER.getAssociacaoEntidadeAtributoList()) {
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach = em.getReference(associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach.getClass(), associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach.getCodigo());
                attachedAssociacaoEntidadeAtributoList.add(associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach);
            }
            atributoMER.setAssociacaoEntidadeAtributoList(attachedAssociacaoEntidadeAtributoList);
            List<AssociacaoRelacionamentoAtributo> attachedAssociacaoRelacionamentoAtributoList = new ArrayList<AssociacaoRelacionamentoAtributo>();
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach : atributoMER.getAssociacaoRelacionamentoAtributoList()) {
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach = em.getReference(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach.getClass(), associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach.getCodigo());
                attachedAssociacaoRelacionamentoAtributoList.add(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach);
            }
            atributoMER.setAssociacaoRelacionamentoAtributoList(attachedAssociacaoRelacionamentoAtributoList);
            em.persist(atributoMER);
            for (DicionarioMER dicionarioMERListDicionarioMER : atributoMER.getDicionarioMERList()) {
                dicionarioMERListDicionarioMER.getAtributoMERList().add(atributoMER);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            for (AtributoMER atributoMERListAtributoMER : atributoMER.getAtributoMERList()) {
                atributoMERListAtributoMER.getAtributoMERList().add(atributoMER);
                atributoMERListAtributoMER = em.merge(atributoMERListAtributoMER);
            }
            for (AtributoMER atributoMERList1AtributoMER : atributoMER.getAtributoMERList1()) {
                atributoMERList1AtributoMER.getAtributoMERList().add(atributoMER);
                atributoMERList1AtributoMER = em.merge(atributoMERList1AtributoMER);
            }
            for (AtributoMR atributoMRListAtributoMR : atributoMER.getAtributoMRList()) {
                atributoMRListAtributoMR.getAtributoMERList().add(atributoMER);
                atributoMRListAtributoMR = em.merge(atributoMRListAtributoMR);
            }
            for (Tabela tabelaListTabela : atributoMER.getTabelaList()) {
                tabelaListTabela.getAtributoMERList().add(atributoMER);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListAssociacaoEntidadeAtributo : atributoMER.getAssociacaoEntidadeAtributoList()) {
                AtributoMER oldNomeatributoOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo = associacaoEntidadeAtributoListAssociacaoEntidadeAtributo.getNomeatributo();
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributo.setNomeatributo(atributoMER);
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributo = em.merge(associacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                if (oldNomeatributoOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo != null) {
                    oldNomeatributoOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo.getAssociacaoEntidadeAtributoList().remove(associacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                    oldNomeatributoOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo = em.merge(oldNomeatributoOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                }
            }
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo : atributoMER.getAssociacaoRelacionamentoAtributoList()) {
                AtributoMER oldNomeatributoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.getNomeatributo();
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.setNomeatributo(atributoMER);
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = em.merge(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                if (oldNomeatributoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo != null) {
                    oldNomeatributoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.getAssociacaoRelacionamentoAtributoList().remove(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                    oldNomeatributoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = em.merge(oldNomeatributoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findAtributoMER(atributoMER.getNome()) != null) {
                throw new PreexistingEntityException("AtributoMER " + atributoMER + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(AtributoMER atributoMER) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            AtributoMER persistentAtributoMER = em.find(AtributoMER.class, atributoMER.getNome());
            List<DicionarioMER> dicionarioMERListOld = persistentAtributoMER.getDicionarioMERList();
            List<DicionarioMER> dicionarioMERListNew = atributoMER.getDicionarioMERList();
            List<AtributoMER> atributoMERListOld = persistentAtributoMER.getAtributoMERList();
            List<AtributoMER> atributoMERListNew = atributoMER.getAtributoMERList();
            List<AtributoMER> atributoMERList1Old = persistentAtributoMER.getAtributoMERList1();
            List<AtributoMER> atributoMERList1New = atributoMER.getAtributoMERList1();
            List<AtributoMR> atributoMRListOld = persistentAtributoMER.getAtributoMRList();
            List<AtributoMR> atributoMRListNew = atributoMER.getAtributoMRList();
            List<Tabela> tabelaListOld = persistentAtributoMER.getTabelaList();
            List<Tabela> tabelaListNew = atributoMER.getTabelaList();
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListOld = persistentAtributoMER.getAssociacaoEntidadeAtributoList();
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListNew = atributoMER.getAssociacaoEntidadeAtributoList();
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListOld = persistentAtributoMER.getAssociacaoRelacionamentoAtributoList();
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListNew = atributoMER.getAssociacaoRelacionamentoAtributoList();
            List<String> illegalOrphanMessages = null;
            
            if( associacaoEntidadeAtributoListOld !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListOld) {
                if (!associacaoEntidadeAtributoListNew.contains(associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain AssociacaoEntidadeAtributo " + associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo + " since its nomeatributo field is not nullable.");
                }
            }
            
            if( associacaoRelacionamentoAtributoListOld !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListOld) {
                if (!associacaoRelacionamentoAtributoListNew.contains(associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain AssociacaoRelacionamentoAtributo " + associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo + " since its nomeatributo field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<DicionarioMER> attachedDicionarioMERListNew = new ArrayList<DicionarioMER>();
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMERToAttach : dicionarioMERListNew) {
                dicionarioMERListNewDicionarioMERToAttach = em.getReference(dicionarioMERListNewDicionarioMERToAttach.getClass(), dicionarioMERListNewDicionarioMERToAttach.getId());
                attachedDicionarioMERListNew.add(dicionarioMERListNewDicionarioMERToAttach);
            }
            dicionarioMERListNew = attachedDicionarioMERListNew;
            atributoMER.setDicionarioMERList(dicionarioMERListNew);
            List<AtributoMER> attachedAtributoMERListNew = new ArrayList<AtributoMER>();
            
            if( atributoMERListNew !=null)
            for (AtributoMER atributoMERListNewAtributoMERToAttach : atributoMERListNew) {
                atributoMERListNewAtributoMERToAttach = em.getReference(atributoMERListNewAtributoMERToAttach.getClass(), atributoMERListNewAtributoMERToAttach.getNome());
                attachedAtributoMERListNew.add(atributoMERListNewAtributoMERToAttach);
            }
            atributoMERListNew = attachedAtributoMERListNew;
            atributoMER.setAtributoMERList(atributoMERListNew);
            List<AtributoMER> attachedAtributoMERList1New = new ArrayList<AtributoMER>();
            
            if( atributoMERList1New !=null)
            for (AtributoMER atributoMERList1NewAtributoMERToAttach : atributoMERList1New) {
                atributoMERList1NewAtributoMERToAttach = em.getReference(atributoMERList1NewAtributoMERToAttach.getClass(), atributoMERList1NewAtributoMERToAttach.getNome());
                attachedAtributoMERList1New.add(atributoMERList1NewAtributoMERToAttach);
            }
            atributoMERList1New = attachedAtributoMERList1New;
            atributoMER.setAtributoMERList1(atributoMERList1New);
            List<AtributoMR> attachedAtributoMRListNew = new ArrayList<AtributoMR>();
            
            if( atributoMRListNew !=null)
            for (AtributoMR atributoMRListNewAtributoMRToAttach : atributoMRListNew) {
                atributoMRListNewAtributoMRToAttach = em.getReference(atributoMRListNewAtributoMRToAttach.getClass(), atributoMRListNewAtributoMRToAttach.getNome());
                attachedAtributoMRListNew.add(atributoMRListNewAtributoMRToAttach);
            }
            atributoMRListNew = attachedAtributoMRListNew;
            atributoMER.setAtributoMRList(atributoMRListNew);
            List<Tabela> attachedTabelaListNew = new ArrayList<Tabela>();
            
            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabelaToAttach : tabelaListNew) {
                tabelaListNewTabelaToAttach = em.getReference(tabelaListNewTabelaToAttach.getClass(), tabelaListNewTabelaToAttach.getNome());
                attachedTabelaListNew.add(tabelaListNewTabelaToAttach);
            }
            tabelaListNew = attachedTabelaListNew;
            atributoMER.setTabelaList(tabelaListNew);
            List<AssociacaoEntidadeAtributo> attachedAssociacaoEntidadeAtributoListNew = new ArrayList<AssociacaoEntidadeAtributo>();
            
            if( associacaoEntidadeAtributoListNew !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach : associacaoEntidadeAtributoListNew) {
                associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach = em.getReference(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach.getClass(), associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach.getCodigo());
                attachedAssociacaoEntidadeAtributoListNew.add(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach);
            }
            associacaoEntidadeAtributoListNew = attachedAssociacaoEntidadeAtributoListNew;
            atributoMER.setAssociacaoEntidadeAtributoList(associacaoEntidadeAtributoListNew);
            List<AssociacaoRelacionamentoAtributo> attachedAssociacaoRelacionamentoAtributoListNew = new ArrayList<AssociacaoRelacionamentoAtributo>();
            
            if( associacaoRelacionamentoAtributoListNew !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach : associacaoRelacionamentoAtributoListNew) {
                associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach = em.getReference(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach.getClass(), associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach.getCodigo());
                attachedAssociacaoRelacionamentoAtributoListNew.add(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach);
            }
            associacaoRelacionamentoAtributoListNew = attachedAssociacaoRelacionamentoAtributoListNew;
            atributoMER.setAssociacaoRelacionamentoAtributoList(associacaoRelacionamentoAtributoListNew);
            atributoMER = em.merge(atributoMER);
            
            if( dicionarioMERListOld !=null)
            for (DicionarioMER dicionarioMERListOldDicionarioMER : dicionarioMERListOld) {
                if (!dicionarioMERListNew.contains(dicionarioMERListOldDicionarioMER)) {
                    dicionarioMERListOldDicionarioMER.getAtributoMERList().remove(atributoMER);
                    dicionarioMERListOldDicionarioMER = em.merge(dicionarioMERListOldDicionarioMER);
                }
            }
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMER : dicionarioMERListNew) {
                if (!dicionarioMERListOld.contains(dicionarioMERListNewDicionarioMER)) {
                    dicionarioMERListNewDicionarioMER.getAtributoMERList().add(atributoMER);
                    dicionarioMERListNewDicionarioMER = em.merge(dicionarioMERListNewDicionarioMER);
                }
            }
            
            if( atributoMERListOld !=null)
            for (AtributoMER atributoMERListOldAtributoMER : atributoMERListOld) {
                if (!atributoMERListNew.contains(atributoMERListOldAtributoMER)) {
                    atributoMERListOldAtributoMER.getAtributoMERList().remove(atributoMER);
                    atributoMERListOldAtributoMER = em.merge(atributoMERListOldAtributoMER);
                }
            }
            
            if( atributoMERListNew !=null)
            for (AtributoMER atributoMERListNewAtributoMER : atributoMERListNew) {
                if (!atributoMERListOld.contains(atributoMERListNewAtributoMER)) {
                    atributoMERListNewAtributoMER.getAtributoMERList().add(atributoMER);
                    atributoMERListNewAtributoMER = em.merge(atributoMERListNewAtributoMER);
                }
            }
            
            if( atributoMERList1Old !=null)
            for (AtributoMER atributoMERList1OldAtributoMER : atributoMERList1Old) {
                if (!atributoMERList1New.contains(atributoMERList1OldAtributoMER)) {
                    atributoMERList1OldAtributoMER.getAtributoMERList().remove(atributoMER);
                    atributoMERList1OldAtributoMER = em.merge(atributoMERList1OldAtributoMER);
                }
            }
            
            if( atributoMERList1New !=null)
            for (AtributoMER atributoMERList1NewAtributoMER : atributoMERList1New) {
                if (!atributoMERList1Old.contains(atributoMERList1NewAtributoMER)) {
                    atributoMERList1NewAtributoMER.getAtributoMERList().add(atributoMER);
                    atributoMERList1NewAtributoMER = em.merge(atributoMERList1NewAtributoMER);
                }
            }
            
            if( atributoMRListOld !=null)
            for (AtributoMR atributoMRListOldAtributoMR : atributoMRListOld) {
                if (!atributoMRListNew.contains(atributoMRListOldAtributoMR)) {
                    atributoMRListOldAtributoMR.getAtributoMERList().remove(atributoMER);
                    atributoMRListOldAtributoMR = em.merge(atributoMRListOldAtributoMR);
                }
            }
            
            if( atributoMRListNew !=null)
            for (AtributoMR atributoMRListNewAtributoMR : atributoMRListNew) {
                if (!atributoMRListOld.contains(atributoMRListNewAtributoMR)) {
                    atributoMRListNewAtributoMR.getAtributoMERList().add(atributoMER);
                    atributoMRListNewAtributoMR = em.merge(atributoMRListNewAtributoMR);
                }
            }
            
            if( tabelaListOld !=null)
            for (Tabela tabelaListOldTabela : tabelaListOld) {
                if (!tabelaListNew.contains(tabelaListOldTabela)) {
                    tabelaListOldTabela.getAtributoMERList().remove(atributoMER);
                    tabelaListOldTabela = em.merge(tabelaListOldTabela);
                }
            }
            
            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabela : tabelaListNew) {
                if (!tabelaListOld.contains(tabelaListNewTabela)) {
                    tabelaListNewTabela.getAtributoMERList().add(atributoMER);
                    tabelaListNewTabela = em.merge(tabelaListNewTabela);
                }
            }
            
            if( associacaoEntidadeAtributoListNew !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListNew) {
                if (!associacaoEntidadeAtributoListOld.contains(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo)) {
                    AtributoMER oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.getNomeatributo();
                    associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.setNomeatributo(atributoMER);
                    associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = em.merge(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                    if (oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo != null && !oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.equals(atributoMER)) {
                        oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.getAssociacaoEntidadeAtributoList().remove(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                        oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = em.merge(oldNomeatributoOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                    }
                }
            }
            
            if( associacaoRelacionamentoAtributoListNew !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListNew) {
                if (!associacaoRelacionamentoAtributoListOld.contains(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo)) {
                    AtributoMER oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.getNomeatributo();
                    associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.setNomeatributo(atributoMER);
                    associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = em.merge(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                    if (oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo != null && !oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.equals(atributoMER)) {
                        oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.getAssociacaoRelacionamentoAtributoList().remove(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                        oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = em.merge(oldNomeatributoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = atributoMER.getNome();
                if (findAtributoMER(id) == null) {
                    throw new NonexistentEntityException("The atributoMER with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            AtributoMER atributoMER;
            try {
                atributoMER = em.getReference(AtributoMER.class, id);
                atributoMER.getNome();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The atributoMER with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListOrphanCheck = atributoMER.getAssociacaoEntidadeAtributoList();
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListOrphanCheckAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This AtributoMER (" + atributoMER + ") cannot be destroyed since the AssociacaoEntidadeAtributo " + associacaoEntidadeAtributoListOrphanCheckAssociacaoEntidadeAtributo + " in its associacaoEntidadeAtributoList field has a non-nullable nomeatributo field.");
            }
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListOrphanCheck = atributoMER.getAssociacaoRelacionamentoAtributoList();
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListOrphanCheckAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This AtributoMER (" + atributoMER + ") cannot be destroyed since the AssociacaoRelacionamentoAtributo " + associacaoRelacionamentoAtributoListOrphanCheckAssociacaoRelacionamentoAtributo + " in its associacaoRelacionamentoAtributoList field has a non-nullable nomeatributo field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<DicionarioMER> dicionarioMERList = atributoMER.getDicionarioMERList();
            for (DicionarioMER dicionarioMERListDicionarioMER : dicionarioMERList) {
                dicionarioMERListDicionarioMER.getAtributoMERList().remove(atributoMER);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            List<AtributoMER> atributoMERList = atributoMER.getAtributoMERList();
            for (AtributoMER atributoMERListAtributoMER : atributoMERList) {
                atributoMERListAtributoMER.getAtributoMERList().remove(atributoMER);
                atributoMERListAtributoMER = em.merge(atributoMERListAtributoMER);
            }
            List<AtributoMER> atributoMERList1 = atributoMER.getAtributoMERList1();
            for (AtributoMER atributoMERList1AtributoMER : atributoMERList1) {
                atributoMERList1AtributoMER.getAtributoMERList().remove(atributoMER);
                atributoMERList1AtributoMER = em.merge(atributoMERList1AtributoMER);
            }
            List<AtributoMR> atributoMRList = atributoMER.getAtributoMRList();
            for (AtributoMR atributoMRListAtributoMR : atributoMRList) {
                atributoMRListAtributoMR.getAtributoMERList().remove(atributoMER);
                atributoMRListAtributoMR = em.merge(atributoMRListAtributoMR);
            }
            List<Tabela> tabelaList = atributoMER.getTabelaList();
            for (Tabela tabelaListTabela : tabelaList) {
                tabelaListTabela.getAtributoMERList().remove(atributoMER);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            em.remove(atributoMER);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<AtributoMER> findAtributoMEREntities() {
        return findAtributoMEREntities(true, -1, -1);
    }

    public List<AtributoMER> findAtributoMEREntities(int maxResults, int firstResult) {
        return findAtributoMEREntities(false, maxResults, firstResult);
    }

    private List<AtributoMER> findAtributoMEREntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(AtributoMER.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public AtributoMER findAtributoMER(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(AtributoMER.class, id);
        } finally {
            em.close();
        }
    }

    public int getAtributoMERCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<AtributoMER> rt = cq.from(AtributoMER.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
